#ifndef CLIENT_SERVER_H
#define CLIENT_SERVER_H
#include "tcpsocket.h"
#include "QString"
#include "QtCore"
#include "thread.h"
#include "msg_list.h"
#include "tcpsocket.h"
#include "projectdata.h"
#include "inner_msg.h"
/*
 * 这个类根据客户端现有的状态
 * 向事务队列发送指令
 * 同时接受来自事务队列的指令 发送给客户端
*/
typedef enum
{
    CLIENT_NULL,
    CLIENT_REIGSTER, //进入注册
    CLIENT_LOGIN, //进入登录
    CLIENT_ONLINE, //进入在线
}CLIENT_STATUS;
typedef enum
{
    CLIENT_REIGSTER_INIT, //进入注册
    CLIENT_REIGSTER_WAIT_USR_INFO,//等待用户信息
    CLIENT_REIGSTER_WAIT_USR_CHECK,//等待用户校验
    CLIENT_REIGSTER_WAITSQL,
    CLIENT_REIGSTER_SEUCCESS,
    CLIENT_REIGSTER_FAILED
}CLIENT_REGISTER_STATUS;
typedef enum
{
    CLIENT_LOGIN_INIT, //登录
    CLIENT_LOGIN_WAIT_USR_INFO,//等待用户信息
    CLIENT_LOGIN_WAIT_USR_CHECK,//等待用户校验
    CLIENT_LOGIN_SEUCCESS,
    CLIENT_LOGIN_FAILED
}CLIENT_LOGIN_STATUS;
class Msg_List;
class Inner_Msg;
class Client_Server :Thread//在线用户服务
{
    Q_OBJECT
public:
    Client_Server(TcpSocket *pSock);
    void Get_Msg(QString data);
    void Get_innerMsg(Inner_Msg* Msg);
    ~Client_Server()=default;
    CLIENT_STATUS Client_Status;
    bool operator == (TcpSocket* pSock);
    bool operator == (QString uid);
    void Task_ForInnerMsg();
    void Task_ForOuterMsg();
    QString uid;
    void process() override;

private:
    void ClientWrite(QByteArray data);
    TcpSocket* pSock;
    bool Msg_Block;
    QQueue<QString> MsgList;// 外部接受
    Msg_List* innermsglist;//已经完成发送，正在 等待结果的消息
    QQueue<Inner_Msg* >Recive_inner_List;// 已经接受，但是， 没有进行处理的消息
    QThread SockThread;
    CLIENT_STATUS client_status;
    CLIENT_REGISTER_STATUS client_register_status;
    CLIENT_LOGIN_STATUS  client_login_status;
};

#endif // CLIENT_SERVER_H
